/*
线程缓存是每个线程独有的，用于小于256KB的内存的分配，
线程从这里申请内存不需要加锁，每个线程独享一个cache。
*/


#ifndef CTHREADCACHE_H
#define CTHREADCACHE_H

#include "Common.h"


/*
申请内存
当内存申请size<=256KB，先获取到线程本地存储的thread cache对象，计算size映射的哈希桶自由链表下标i。
如果自由链表_freeLists[i]中有对象，则直接Pop一个内存对象返回。
如果_freeLists[i]中没有对象时，则批量从central cache中获取一定数量的对象，插入到自由链表并返回一个对象。

释放内存
当释放内存小于256k时将内存释放回thread cache，计算size映射自由链表桶位置i，将对象Push到_freeLists[i]。
当链表的长度过长，则回收一部分内存对象到central cache。
*/


//线程缓存
class ThreadCache
{
public:
	//申请内存
	void* Allocate(size_t size);

	//释放内存
	void Deallocate(void* ptr, size_t size);

	//从中心缓存获取内存
	void* FetchFromCentralCache(size_t index, size_t size);

	//释放对象时，如果链表过长，则回收一部分内存到central cache
	void ListTooLong(FreeList& list, size_t size);

private:
	FreeList m_freeLists[NFREELISTS];
};

// TLS:在线程内全局可访问，但不能被其他线程访问到->保持数据的独立性，不需要锁控制，减少成本
static thread_local ThreadCache* pTLSThreadCache = nullptr;


#endif // !CTHREADCACHE_H


